/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_XSW2.c
** 模块名称： XSW2协议处理模块
** 版 本 号： V1.0
** 作    者： 郭瑞
** 
** 修改记录： 版本     修改人      时间         修改内容
******************************************************************************/
 
/******************************************************************************
* 头文件
******************************************************************************/
#include <string.h>
#include "Config.h"
#include "App_Protocol.h"
#include "App_MainTask.h"
/******************************************************************************
* 本文件宏定义 ('#define')                             
******************************************************************************/
#define FRAME_LEN_MAX		100		/*最大帧长度*/
#define LOOP_CYCLE          25      /*Loop函数轮询周期，单位ms*/
#define set_bit(val,bitn) val |=(1<<bitn)
/******************************************************************************
* 本文件类型定义 ('typedef')                                         
******************************************************************************/

/******************************************************************************
* 本文件静态函数声明 ('static')
******************************************************************************/
static void vPROTOCOL_Get_Data_XSW2(void);
static void vPROTOCOL_Send_XSW2(void);
 
/******************************************************************************
* 全局变量定义 
******************************************************************************/
uint8_t gucRx_Buffer[FRAME_LEN_MAX] = {0};
uint8_t gucTx_Buffer[FRAME_LEN_MAX] = {0};
uint8_t 					gucRx_Frame_OK 	= 0;
uint16_t 					gusRx_Len 		= 0;
stRECEIVED_DATA			gtReceived_Data 	= {0};
stSEND_DATA				gtSend_Data			= {0};
enSEND_DATA_TYPE		geSend_Data_Type 	= Send_Stop;
uint8_t					gucTimeOutError 	= 0;
uint32_t                gulCommunicationCnt = 0;
uint8_t                 gucStartReceive = 0;		/*是否开始接收标志*/
uint8_t                 gucReceiveCnt = 0;			/*接收计数*/
/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/
 
 
/******************************************************************************
** 功  能：获取一帧协议数据
** 参  数：pData-指向数据的指针，Len-数据长度
** 返回值：无
** 备  注：该函数是协议处理模块对外获取数据的接口，接收到完整一帧后，调用该函数进行处理
******************************************************************************/
void vPROTOCOL_Get_OneFrame(uint8_t *pData,uint16_t Len)
{
	if(Len > 1)		/*如果接收到的数据大于1字节，认为是一个完整帧（DMA+IDLE中断接收），直接放入缓存进行处理*/
	{
		memcpy(gucRx_Buffer,pData,Len);		/*将数据拷贝到缓冲区*/
		gusRx_Len = Len;					/*数据长度*/
		gucRx_Frame_OK = 1;					/*接收到一帧标志置1*/
	}
	else	/*如果只接收到1个字节，认为控制器是按照单个字节发送，则利用帧间超时来判断一帧接收完毕*/
	{
		if(gucStartReceive == 0)
		{
			gucStartReceive = 1;		/*标记开始接收*/
			gucReceiveCnt = 0;
		}
		gucRx_Buffer[gucReceiveCnt] = *pData;
		if(++gucReceiveCnt > FRAME_LEN_MAX)
		{
			gucReceiveCnt = 0;
			gucStartReceive = 0;
		}
	}
}

/******************************************************************************
** 功  能：解析协议数据
** 参  数：无
** 返回值：无
** 备  注：该函数在主函数中被循环调用。用于解析接收到的协议数据
******************************************************************************/
void vPROTOCOL_Loop(void)
{
    static uint16_t lusCnt = 0;
	static uint8_t  lucReceiveCnt = 0;	/*用于保存上一次的接收计数*/
	
	if(gucRx_Frame_OK == 1)
	{
		gulCommunicationCnt = ulBsp_Getticks();
		gucTimeOutError = 0;
		if(gucRx_Buffer[0] == 0x3A && gucRx_Buffer[1] == 0x1C)
		{
			/*内部控制指令*/
			//vPROTOCOL_Factory_Command();
            gucRx_Frame_OK = 0;
		}
		else
		{
			/*调用不同的协议进行解析*/
			vPROTOCOL_Get_Data_XSW2();/*XSW2协议高级菜单与5S协议共用*/

		}
		gucRx_Frame_OK = 0;
	}
	else
	{
		if(gucStartReceive == 1)
		{
			if((gucReceiveCnt > 0) && (gucReceiveCnt == lucReceiveCnt))
			{
				gucStartReceive = 0;
				gusRx_Len = gucReceiveCnt;
				gucRx_Frame_OK = 1;
			}
			else
			{
				lucReceiveCnt = gucReceiveCnt;
			}
		}
		else
		{
		}
		/*当发送状态为停止时，不报通讯超时错误*/
		if(geSend_Data_Type != Send_Stop)
		{
			/*通讯超时时间，10s*/
			if(ulBsp_Getticks() - gulCommunicationCnt > 10000)
			{
				gucTimeOutError = 1;
                gtReceived_Data.Speed_Cnt = 0;  /*确保返回速度为0*/
			}
		}
		else
		{
			gucTimeOutError = 0;
			gulCommunicationCnt = ulBsp_Getticks();
		}
	}
    /*500ms发送一次数据。根据Loop函数的调用周期，计算次数*/
    if(++lusCnt > (100 / LOOP_CYCLE))
    {
        lusCnt = 0;
        vPROTOCOL_Send_XSW2();
    }
}

/******************************************************************************
** 功  能：设置大灯状态
** 参  数：State-大灯状态。0-关闭，1-打开
** 返回值：无
** 备  注：所有协议通用
******************************************************************************/
void vPROTOCOL_Set_Lamp(uint8_t State)
{
	gtSend_Data.Lamp = State == 0 ? 0 : 1;
}



/******************************************************************************
** 功  能：设置档位
** 参  数：Pas-档位值，最大为9，最小为-1,-1表示助推档
** 返回值：无
** 备  注：本函数不对档位值的合理性做检查。请保证传入的档位值正确。
**         所有协议通用
******************************************************************************/
void vPROTOCOL_Set_Pas(int8_t Pas)
{
 
}

/******************************************************************************
** 功  能：设置限速值
** 参  数：Speed-限速值
** 返回值：无
** 备  注：本函数不对传入值的合理性做检查。请保证传入的值正确。
**         所有协议通用
******************************************************************************/
void vPROTOCOL_Set_Speed_Limit(uint16_t Speed)
{
	gtSend_Data.Speed_Limit = Speed;
}

/******************************************************************************
** 功  能：翻转巡航状态
** 参  数：无
** 返回值：无
** 备  注：该函数会将切换巡航状态标志置1，当协议发送出去以后，自动清零
******************************************************************************/
void vPROTOCOL_Toggle_Cruise(void)
{
	gtSend_Data.Switch_Cruise = 1;
}

/******************************************************************************
** 功  能：设置轮径
** 参  数：Wheel-轮径值
** 返回值：无
** 备  注：为了和其它协议兼容，传入的轮径值是实际值的10倍
******************************************************************************/
void vPROTOCOL_Set_Wheel(uint16_t Wheel)
{
	gtSend_Data.Wheel_Diameter = Wheel / 10;
}

/******************************************************************************
** 功  能：设置欠压标志
** 参  数：Battery_Low-欠压标志，0-不欠压，1-欠压
** 返回值：无
** 备  注：本函数不对传入值的合理性做检查。请保证传入的值正确。
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Battery_Low(uint8_t Battery_Low)
{
    gtSend_Data.Battery_Low = Battery_Low == 0 ? 0 : 1;
}

/******************************************************************************
** 功  能：设置助推时的最大PWM
** 参  数：PWM-最大PWM值，0-255
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_PWM(uint8_t PWM)
{
    gtSend_Data.Max_PWM = PWM;
}

/******************************************************************************
** 功  能：设置助力方向
** 参  数：Assistant_Dir-助力方向，0-正向，1-反向
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Assistant_Dir(uint8_t Assistant_Dir)
{
    gtSend_Data.Assistant_Dir = Assistant_Dir == 0 ? 0 : 1;
}

/******************************************************************************
** 功  能：设置助力磁钢数
** 参  数：Assistant_Num-助力磁钢数
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Assistant_Num(uint8_t Assistant_Num)
{
    gtSend_Data.Assistant_Num = Assistant_Num;
}

/******************************************************************************
** 功  能：设置助力灵敏度（助力过几个磁钢开始）
** 参  数：Assistant_Sensitivity-助力灵敏度
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Assistant_Sensitivity(uint8_t Assistant_Sensitivity)
{
    if(Assistant_Sensitivity > 63)
    {
        Assistant_Sensitivity = 63;     /*设置最大值*/
    }
    if(Assistant_Sensitivity == 0)
    {
        Assistant_Sensitivity = 1;      /*助力灵敏度不能为0*/
    }
    gtSend_Data.Assistant_Sensitivity = Assistant_Sensitivity;
}

/******************************************************************************
** 功  能：设置速度传感器数量
** 参  数：Speed_Sensor_Num-速度传感器数量
** 返回值：无
** 备  注：
** 适用协议：XSW2        
******************************************************************************/
void vPROTOCOL_Set_Speed_Sensor_Num(uint8_t Speed_Sensor_Num)
{
    if(Speed_Sensor_Num > 99)
    {
        Speed_Sensor_Num = 99;
    }
    gtSend_Data.Speed_Sensor_Num = Speed_Sensor_Num;
}

/******************************************************************************
** 功  能：设置驱动方式
** 参  数：Mode-驱动方式，0-助力驱动，1-电驱动，2-共存
** 返回值：无
** 备  注：      
******************************************************************************/
void vPROTOCOL_Set_Drive_Mode(uint8_t Mode)
{
    gtSend_Data.Drive_Mode = Mode;
}

/******************************************************************************
** 功  能：设置巡航模式
** 参  数：Mode-巡航模式，0-触发方式，1-长按模式
** 返回值：无
** 备  注：      
******************************************************************************/
void vPROTOCOL_Set_Cruise_Mode(uint8_t Mode)
{
    gtSend_Data.Cruise_Mode = Mode;
}

/******************************************************************************
** 功  能：设置0启动还是非零启动
** 参  数：Mode-启动方式，0-零启动，1-非零启动
** 返回值：无
** 备  注：      
******************************************************************************/
void vPROTOCOL_Set_Start_Mode(uint8_t Mode)
{
    gtSend_Data.Zero_Start = Mode;
}

/******************************************************************************
** 功  能：设置启动强度（缓启动参数）
** 参  数：Start_Strength-启动强度
** 返回值：无
** 备  注：
** 适用协议：       
******************************************************************************/
void vPROTOCOL_Set_Start_Strength(uint8_t Start_Strength)
{
    if(Start_Strength > 5)
    {
        Start_Strength = 5;
    }
    gtSend_Data.Start_Strength = Start_Strength;
}

/******************************************************************************
** 功  能：设置转把是否支持助推
** 参  数：Handle_Push-转把是否支持助推，0-正常转把，1-转把6km助推
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Handle_Push(uint8_t Handle_Push)
{
    gtSend_Data.Handle_Push = Handle_Push == 0 ? 0 : 1;
}

/******************************************************************************
** 功  能：设置转把是否支持分档
** 参  数：Handle_Segement-转把是否支持分档，0-转把不分档，1-转把分档
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Handle_Segement(uint8_t Handle_Segement)
{
    gtSend_Data.Handle_Segement = Handle_Segement == 0 ? 0 : 1;
}

/******************************************************************************
** 功  能：设置系统欠压值
** 参  数：Low_Voltage-系统欠压值，分辨率：0.1V
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Low_Voltage(uint16_t Low_Voltage)
{
    gtSend_Data.Low_Voltage = Low_Voltage;
}

/******************************************************************************
** 功  能：设置系统电压值
** 参  数：Sys_Voltage-系统电压值，分辨率：1V，支持：24V，36V，48V
** 返回值：无
** 备  注：欠压点要比最低电压少1V
** 适用协议：       
******************************************************************************/
void vPROTOCOL_Set_Sys_Voltage(uint16_t Sys_Voltage)
{

}

/******************************************************************************
** 功  能：设置系统限流值
** 参  数：Current_Limit-系统限流值，分辨率：0.5V
** 返回值：无
** 备  注：
** 适用协议：5S        
******************************************************************************/
void vPROTOCOL_Set_Current_Limit(uint16_t Current_Limit)
{
    gtSend_Data.Current_Limit = Current_Limit;
}

/******************************************************************************
** 功  能：设置控制器状态
** 参  数：
** 返回值：无
** 备  注：
** 适用协议：XSW2        
******************************************************************************/
void vPROTOCOL_Controller_Shut_Flag(uint8_t Shut_Flag)
{
    gtSend_Data.Shut_flag = Shut_Flag;
}

/******************************************************************************
** 功  能：设置档位范围
** 参  数：Pas_Range-档位值范围，3，4，5，9
** 返回值：无
** 备  注：J协议不支持档位范围设置，为了兼容其他协议，该函数为空即可。
******************************************************************************/
void vPROTOCOL_Set_Pas_Range(int8_t Pas_Range)
{

}

/******************************************************************************
** 功  能：设置发送运行数据
** 参  数：无
** 返回值：无
** 备  注：本协议无用。为兼容性保留函数
******************************************************************************/
void vPROTOCOL_Send_Run_Data(void)
{
	
}

/******************************************************************************
** 功  能：设置发送配置数据
** 参  数：无
** 返回值：无
** 备  注：本协议无用。为兼容性保留函数
******************************************************************************/
void vPROTOCOL_Send_Config_Data(void)
{
	
}

/******************************************************************************
** 功  能：设置发送一次配置数据
** 参  数：无
** 返回值：无
** 备  注：本协议无用。为兼容性保留函数
******************************************************************************/
void vPROTOCOL_Send_Config_Data_OneTime(void)
{

}

/******************************************************************************
** 功  能：停止发送数据
** 参  数：无
** 返回值：无
** 备  注：本协议无用。为兼容性保留函数。
******************************************************************************/
void vPROTOCOL_Send_Stop(void)
{

}

/******************************************************************************
** 功  能：获取巡航状态
** 参  数：无
** 返回值：巡航状态
** 备  注：
******************************************************************************/
uint8_t ucPROTOCOL_Get_Cruise_State(void)
{
	return gtReceived_Data.CruiseState;
}

/******************************************************************************
** 功  能：获取电池容量
** 参  数：无
** 返回值：-1表示未获取到电池容量，电池容量，0-100%
** 备  注：J协议不支持SOC，返回-1，为了兼容其他协议。
          XSW2协议不支持SOC，返回-1，为了兼容其他协议。
******************************************************************************/
int8_t cPROTOCOL_Get_Soc(void)
{
	return -1;
}

/******************************************************************************
** 功  能：获取当前电流值
** 参  数：无
** 返回值：实际电流值的10倍。比如实际电流12.3A，返回123
** 备  注：所有协议通用
******************************************************************************/
uint16_t usPROTOCOL_Get_Current(void)
{
	if(gucTimeOutError == 1)
	{
		return 0;
	}
	else
	{
		return gtReceived_Data.Current;
	}
}
 
/******************************************************************************
** 功  能：获取当前车速
** 参  数：无
** 返回值：实际车速*10.比如返回120，实际车速即12.0Km/h
** 备  注：所有协议通用       
******************************************************************************/
uint16_t usPROTOCOL_Get_Speed(void)
{
	if(gtReceived_Data.Speed_Cnt >= 0x0DAC || gtReceived_Data.Speed_Cnt == 0 || gucTimeOutError == 1)
	{
		/*如果车轮转动一周的时间大于等于3500，或者等于0，或者通讯超时，即认为速度为0*/
		return 0;
	}
	else
	{
		if(gtSend_Data.Wheel_Diameter == 27 && ((CONFIG_27INCH_DISPLAY == DISPLAY_700C) || (CONFIG_27INCH_DISPLAY == DISPLAY_275)))
		{
			/*轮径27，按照27.5Inch计算，周长698.5mm，698.5*314*36/100=78958*/
			return 78958 / gtReceived_Data.Speed_Cnt;
		}
		else
		{
			/*其它轮径，按照英寸计算，1inch=25.4mm，25.4*314*36/100=2871*/
			return 2871 * gtSend_Data.Wheel_Diameter / gtReceived_Data.Speed_Cnt;
		}
	}
}

/******************************************************************************
** 功  能：获取错误代码
** 参  数：无
** 返回值：十六进制的错误代码
** 备  注：包括30错误代码（通信超时）
**         所有协议通用
******************************************************************************/
uint8_t ucPROTOCOL_Get_Errcode(void)
{
	if(gucTimeOutError == 1)
	{
		return 0x30;
	}
	else
	{
		return gtReceived_Data.ErrCode;
	}
}


/******************************************************************************
** 功  能：解析XSW2协议数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
static void vPROTOCOL_Get_Data_XSW2(void)
{
	uint8_t Checksum = 0;
	uint8_t n;
    static uint16_t Data_error_memory = 0;
    static uint16_t Data_memory4 = 1;
	for(n = 0;n < 13;n++)
	{
		Checksum ^= gucRx_Buffer[n];	/*计算校验值*/
	}
	/*首字节是0x02，第三个字节是0X01，并且校验正确，认为接收数据无误*/
	if((gucRx_Buffer[0] == 0X02) && (gucRx_Buffer[2] == 0X01) && (gucRx_Buffer[13] == Checksum))
	{
        if(Data_error_memory != ((uint16_t)gucRx_Buffer[3]<<8 | gucRx_Buffer[4]))
        {
            Data_memory4 = ((~Data_error_memory) & ((uint16_t)gucRx_Buffer[3]<<8 | gucRx_Buffer[4]));
        }
        
        
        if((gucRx_Buffer[3] & 0x7B) || (gucRx_Buffer[4] & 0x10))
		{ 
            if(gucRx_Buffer[3] & 0x40)/*霍尔故障*/
            {
                gtReceived_Data.ErrCode	= 0x01; /*错误代码*/
            }
            else if(gucRx_Buffer[3] & 0x20)/*转把故障*/
            {
                gtReceived_Data.ErrCode	= 0x02; /*错误代码*/
            }
            else if(gucRx_Buffer[3] & 0x10)/*控制器故障*/
            {
                gtReceived_Data.ErrCode	= 0x03; /*错误代码*/
            }
            else if(gucRx_Buffer[3] & 0x08)/*欠压保护*/
            {
                gtReceived_Data.ErrCode	= 0x04; /*错误代码*/
            }
            else if(gucRx_Buffer[3] & 0x01)/*电机缺相 */
            {
                gtReceived_Data.ErrCode	= 0x05; /*错误代码*/
            }
            else if(gucRx_Buffer[4] & 0x10)/*通讯故障*/
            {
                gtReceived_Data.ErrCode	= 0x07; /*错误代码*/
            }
		}
		else
		{
            gtSend_Data.Communication_Failure = 0;
			gtReceived_Data.ErrCode = 0x00;			/*错误代码如果是其它值，都认为是无错误*/
		}
        
        gtReceived_Data.CruiseState_6KM = (gucRx_Buffer[3] >> 7)  & 0x01; /*6KM巡航状态*/        
        gtReceived_Data.CruiseState     = (gucRx_Buffer[3] >> 2)  & 0x01; /*巡航状态*/
        
        if(gucRx_Buffer[5] & 0x40)
        {
            gtReceived_Data.Current	= (gucRx_Buffer[5] & 0x3f) * 256 + gucRx_Buffer[6];	/*电流值*/
        }
        else
        {
            gtReceived_Data.Current = gucRx_Buffer[5] * 256 + gucRx_Buffer[6];
            gtReceived_Data.Current = gtReceived_Data.Current * 10;
        }
        
		gtReceived_Data.Speed_Cnt	= (uint16_t)gucRx_Buffer[8] * 256 + gucRx_Buffer[9];		/*车轮转动一周的脉冲时间*/

	}
	
	return;
}

/******************************************************************************
** 功  能：发送XSW2协议数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
static void vPROTOCOL_Send_XSW2(void)
{
	static uint8_t lucVerification_Times = 0;

	uint8_t lucChecksum;
    static uint8_t lucOverSpeed = 0;/*超速移植*/
	
	
    gucTx_Buffer[0] = 0x01;
    gucTx_Buffer[1] = 20;               /*帧长*/
    gucTx_Buffer[2] = 0x01;             /*命令号*/
    gucTx_Buffer[3] = gtSend_Data.Drive_Mode;                /*驱动方式设定 0-助力驱动 1-电驱动 2-助力驱动和电驱动同时共存*/
    gucTx_Buffer[4] = gtSend_Data.Pas;  /*发送档位值*/
	
    if((usPROTOCOL_Get_Speed() > gtSend_Data.Speed_Limit * 10) && ((NO_LIMIT_WHEN_MAX == 0) || ((NO_LIMIT_WHEN_MAX == 1) && (gtSend_Data.Speed_Limit != CONFIG_SPEED_MAX))))
	{
        lucOverSpeed = 1;               /*超速标志置位*/
	}
	else
	{
        /*当车速降低到限速值-1时，清超速标志位*/
        if(usPROTOCOL_Get_Speed() < (gtSend_Data.Speed_Limit - 1) * 10)
        {
            lucOverSpeed = 0;
        }
    }
    
    /*bit7：控制器开关状态。bit6：是否零启动。bit5：灯光控制。bit4：通讯故障。bit3：切换巡航方式。bit2：限速状态。bit1：巡航保持模式。bit0：巡航切换模式。*/
	gucTx_Buffer[5] = ((gtSend_Data.Shut_flag & 0X01) << 7) | ((gtSend_Data.Zero_Start & 0X01) << 6) | ((gtSend_Data.Lamp & 0X01) << 5) | ((gtSend_Data.Communication_Failure & 0X01) << 4) |
                      ((gtSend_Data.Cruise_Mode & 0X01) << 3)    | ((lucOverSpeed & 0X01) << 2)      | ((gtSend_Data.Push  & 0X01) << 1) | (gtSend_Data.Switch_Cruise & 0X01);
    
    /*确保巡航状态改变标志，只发送一次1，其余时间发送0*/
    if(gtSend_Data.Switch_Cruise == 1)
    {
        gtSend_Data.Switch_Cruise = 0;
    }
        
    gucTx_Buffer[6] = gtSend_Data.Speed_Sensor_Num;                 /*测速磁钢数*/
    
    if(gtSend_Data.Wheel_Diameter == 0x1B)
    {
        gucTx_Buffer[7] = 275 / 256;                                /*轮径，单位0.1英寸*/
        gucTx_Buffer[8] = 275  % 256;                               /*轮径，单位0.1英寸*/
    }
    else
    {
        gucTx_Buffer[7] = (gtSend_Data.Wheel_Diameter * 10) / 256;  /*轮径，单位0.1英寸*/
        gucTx_Buffer[8] = (gtSend_Data.Wheel_Diameter * 10)  % 256; /*轮径，单位0.1英寸*/    
    }
    gucTx_Buffer[9] = gtSend_Data.Assistant_Sensitivity;            /*助力灵敏度*/
    
    gucTx_Buffer[10] = gtSend_Data.Start_Strength;                  /*助力启动强度*/
    
    gucTx_Buffer[11] = gtSend_Data.Speed_Limit / 256;               /*限速值*/
    gucTx_Buffer[12] = gtSend_Data.Speed_Limit % 256;               /*限速值*/  
    
    gucTx_Buffer[13] = gtSend_Data.Current_Limit / 10;              /*限流值*/ 
    gucTx_Buffer[14] = gtSend_Data.Low_Voltage / 256;               /*欠压值*/ 
    gucTx_Buffer[15] = gtSend_Data.Low_Voltage % 256;               /*欠压值*/

    gucTx_Buffer[16] = 0;                                           /*转把调速PWM占空比*/
    gucTx_Buffer[17] = 0;                                           /*转把调速PWM占空比*/   
    
    gucTx_Buffer[18] = gtSend_Data.Assistant_Num;                   /*助力磁盘磁钢数*/ 
    
    lucChecksum = 0;                                                /*需要将上一次的校验和清零，否则影响校验*/ 
    for(lucVerification_Times = 0; lucVerification_Times < 19; lucVerification_Times++)
    {
        lucChecksum = lucChecksum ^ gucTx_Buffer[lucVerification_Times];
    }
    
    gucTx_Buffer[19] = lucChecksum;                                 /*校验和*/ 
	
	USART_MCU_Send_Frame(gucTx_Buffer,20);		                    /*发送数据*/

}

/******************************************************************************
** 功  能：复位通信超时计数变量
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_ResetCommunicationOverTime(void)
{
    __disable_irq();
    gucTimeOutError = 0;
    gulCommunicationCnt = ulBsp_Getticks();
    __enable_irq();
    
}

/******************************************************************************
** 功  能：开机上电时，设置默认要发送给控制器的数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Value_When_PowerOn(void)
{ 

}

/******************************************************************************
** 功  能：退出设置时，设置默认要发送给控制器的数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Value_When_ExitSetting(void)
{


}

/******************************************************************************
** 功  能：关机时，设置要发送给控制器的数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Power_Off(void)
{
             
}

